package cn.jtfadmin.sysmonitor.domain.dto;

import lombok.Data;

import java.io.Serializable;
import java.util.List;

/**
 * 文件系统DTO
 * @author jtf
 * @since 0.0.2
 */
@Data
public class FileSystemDTO implements Serializable {




    /**
     * 当前打开的文件描述符数。
     * 文件描述符是抽象的用于访问I/O资源（如文件和网络连接）的句柄。
     * 在基于UNIX的系统对打开的文件数量有一个系统范围的限制描述符。
     * 在Windows系统上，此方法返回被进程持有的总数量。
     * 虽然Windows句柄在概念上类似于文件描述符，但它们还可以引用许多与I/O无关的对象。
     * 打开的文件描述符数（如果可用），否则返回0。
     */
    protected long openFileDescriptors;


    /**
     * 打开的文件描述符的最大数目。文件描述符是抽象的
     * 文件描述符是抽象的用于访问I/O资源（如文件和网络连接）的句柄。
     * 在Windows系统上，此方法返回理论上的最大句柄数（32位上为2^24-2^15，64位上为2^24-2^16）。每个进程可能有一个较低的限制。
     * 虽然Windows句柄在概念上类似于文件描述符，但它们还可以引用许多与I/O无关的对象。
     */
    protected long maxFileDescriptors;


    /**
     * 文件系统
     */
    protected List<FileStoreDTO> fileStores;


    /**
     * 磁盘存储信息
     */
    @Data
    public static class FileStoreDTO{



        /**
         * 文件系统名称
         */
        protected String name;

        /**
         * 文件系统卷名
         */
        protected String volume;

        /**
         * 文件系统标签
         */
        protected String label;

        /**
         * 文件系统映射卷名
         */
        protected String logicalVolume;

        /**
         * 文件系统挂载点
         */
        protected String mount;


        /**
         * 文件系统描述
         */
        protected String description;

        /**
         * 文件系统格式 (FAT, NTFS, etx2, ext4, etc)
         */
        protected String type;

        /**
         * 文件系统选项
         */
        protected String options;

        /**
         * 文件系统uuid
         */
        protected String UUID;

        /**
         * 空闲空间大小，字节
         */
        protected long freeSpace;

        /**
         * 空闲空间大小，可视化数据
         */
        protected String displayFreeSpace;

        /**
         * 使用空间大小，字节
         */
        protected long usableSpace;

        /**
         * 使用空间大小，可视化数据
         */
        protected String displayUsableSpace;


        /**
         * 总空间大小，字节
         */
        protected long totalSpace;

        /**
         * 总空间大小，可视化数据
         */
        protected String displayTotalSpace;

        /**
         * 空闲 索引节点， windows 不适用
         */
        protected long freeInodes;

        /**
         * 总索引节点， windows 不适用
         */
        protected long totalInodes;

        public FileStoreDTO() {
        }

        public FileStoreDTO(String name, String volume, String label, String logicalVolume, String mount, String description, String type, String options, String UUID, long freeSpace, String displayFreeSpace, long usableSpace, String displayUsableSpace, long totalSpace, String displayTotalSpace, long freeInodes, long totalInodes) {
            this.name = name;
            this.volume = volume;
            this.label = label;
            this.logicalVolume = logicalVolume;
            this.mount = mount;
            this.description = description;
            this.type = type;
            this.options = options;
            this.UUID = UUID;
            this.freeSpace = freeSpace;
            this.displayFreeSpace = displayFreeSpace;
            this.usableSpace = usableSpace;
            this.displayUsableSpace = displayUsableSpace;
            this.totalSpace = totalSpace;
            this.displayTotalSpace = displayTotalSpace;
            this.freeInodes = freeInodes;
            this.totalInodes = totalInodes;
        }

        @Override
        public String toString() {
            return "OSFileStore [name=" + getName() + ", volume=" + getVolume() + ", label=" + getLabel()
                    + ", logicalVolume=" + getLogicalVolume() + ", mount=" + getMount() + ", description="
                    + getDescription() + ", fsType=" + getType() + ", options=\"" + getOptions() + "\", uuid=" + getUUID()
                    + ", freeSpace=" + getFreeSpace() + ", usableSpace=" + getUsableSpace() + ", totalSpace="
                    + getTotalSpace() + ", freeInodes=" + getFreeInodes() + ", totalInodes=" + getTotalInodes() + "]";
        }
    }
}
